package com.spring.proxy;

import com.spring.domain.Account;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Reflect {
    public static void main(String[] args) throws NoSuchMethodException, ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
//        Account account = new Account();
//        account.show();

        /* 反射 获取当前的   全限定名  com.spring.domain.Account  （包名.子包.类名.方法） */
        // java.lang.Class
       // Class aClass = Class.forName("com.spring.domain.Account");

        Class aClass = Account.class;

        System.out.println(aClass); //com.spring.domain.Accoun

        /*只能获取公共的属性 不能获取属性  Fields 领域*/
//        Field[] fields = aClass.getFields();
//        for (Field field : fields) {
//            System.out.println(field);
//        }

        /* 私有 或者公有属性*/
//        try {
//            Field money = aClass.getDeclaredField("sex");
//            System.out.println(money);
//
//        } catch (NoSuchFieldException e) {
//            e.printStackTrace();
//        }

      // 构造函数
        Constructor constructor = aClass.getConstructor();
        System.out.println(constructor);  // 无参构造
        try {
            Object o = constructor.newInstance(); // 实例的话的时候  会自动调用无参构造
            System.out.println(o);

        } catch (Exception e) {
            System.out.println(e);
        }


        // 是内部无参构造

        Constructor declaredConstructor = aClass.getDeclaredConstructor();
        System.out.println(declaredConstructor);

        Class[] interfaces = aClass.getInterfaces();
        for (Class anInterface : interfaces) {
            System.out.println(anInterface);
        }

        // 方法的获取

        // 获取所有方法
//        Method[] methods = aClass.getMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }

//        Method show = aClass.getMethod("show");
//        Object o = aClass.newInstance();
//        show.invoke(o);



    }

}
